package net.sh.dpinfrastructure.message;

/**
 * 消息服务<br>
 * 提供两种风格的消息服务模式：
 * <li>生产者消费者模式，一个消息只能被一个消费者消费，如果没有任何注册的消费者，则该消息保留直到有消费者将其消费</li>
 * <li>发布订阅模式，所有注册到对应频道（channel）的订阅者都能获得发布的消息，在消息发布时没有注册到该频道的订阅者则被忽略</li>
 * <br>
 * @author Lancer
 * @date 2016年4月17日上午11:43:53
 *
 */
public interface DPMessage {
    
    /**
     * 
     * 消息监听器
     * 
     * @version 1.0
     * @since JDK1.7
     * @author shaohui
     * @company 上海朝阳永续信息技术有限公司
     * @copyright (c) 2017 SunTime Co'Ltd Inc. All rights reserved.
     * @date 2017年1月5日 下午1:07:52
     */
    public interface Messagelistener {
        
        /**
         * 
         * 消息处理方法
         *
         * @param message 消息体
         * 
         * @author shaohui
         * @date 2017年1月22日 下午1:14:53
         */
        void onMessage(String message);
    }

    /**
     * 消费队列
     * @author Lancer
     * @date 2016年4月17日下午4:12:25
     * @param queueName
     * @return
     *
     */
    String consume(String queueName);
    
    /**
     * 
     * 异步消费（消息驱动），开启一个额外的线程来消费消息
     *
     * @param queueName
     * @param messagelistener
     * @param quit4Exception 是否在发生异常时退出
     * 
     * @author shaohui
     * @date 2017年1月10日 上午9:43:13
     */
    void consumeAsync(String queueName, Messagelistener messagelistener, boolean quit4Exception);
    
    /**
     * 
     * 消费（阻塞）
     *
     * @param queueName
     * @param messageHandler
     * @param quit4Exception 是否在发生异常时退出
     * 
     * @author shaohui
     * @date 2017年1月10日 下午1:46:09
     */
    void consumeSustainBlock(String queueName, Messagelistener messagelistener, boolean quit4Exception);
    
    /**
     * 
     * 生产消息
     * @author Lancer
     * @date 2016年4月17日下午3:42:45
     * @param queueName
     * @param message
     *
     */
    void produce(String queueName, String message);
    
    /**
     * 
     * 发布消息
     *
     * @param queueName
     * @param message
     * 
     * @author shaohui
     * @date 2017年1月5日 上午11:09:17
     */
    void publish(String queueName, String message);
    
    /**
     * 
     * 订阅
     *
     * @param channel
     * @param message
     * @param msgListener 消息监听器
     * @param unsubscribeOnException true：在异常发生时终止订阅
     * 
     * @author shaohui
     * @date 2017年1月5日 上午11:08:42
     */
    void subscribe(String channel, String message, Messagelistener msgListener, boolean unsubscribeOnException);
}
